﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using RestSharp;

namespace Esign.Net.Input
{
    // https://open.esign.cn/doc/opendoc/pdf-sign3/su5g42
    // 或 https://open.esign.cn/doc/opendoc/pdf-sign3/xxk4q6

    public partial class SignFlow
    {
        /// <summary>
        /// 签署文件信息 设置待签署文件信息
        /// </summary>
        public class Doc
        {

            [JsonProperty("fileId")]
            public string FileId { get; set; }

            /// <summary>
            /// 文件名称不可含有以下9个特殊字符：/ \ : * " < > | ？以及所有emoji表情
            /// </summary>
            [JsonProperty("fileName")]
            public string FileName { get; set; }

            /// <summary>
            /// 文件编辑密码
            /// </summary>
            [JsonProperty("fileEditPwd")]
            public string FileEditPwd { get; set; }

            //--------------------------------------------------

            /// <summary>
            /// 合同编号 根据e签宝SaaS官网上设置的规则生成（点击查看 如何设置合同编号），用户未设置则取默认生成的合同编号
            /// https://help.esign.cn/detail?id=aq1itcl9xnzes6a4&nameSpace=cs3-dept%2Fexboae
            /// </summary>
            [JsonProperty("contractNum")]
            public string ContractNum { get; set; }
        }

        public class Attachment
        {

            [JsonProperty("fileId")]
            public string FileId { get; set; }

            [JsonProperty("fileName")]
            public string FileName { get; set; }
        }

        public class Transactor
        {

            [JsonProperty("psnId")]
            public string PsnId { get; set; }
        }

        public class OrgInitiator
        {

            [JsonProperty("orgId")]
            public string OrgId { get; set; }

            [JsonProperty("transactor")]
            public Transactor Transactor { get; set; }
        }

        public class TransactorInfo
        {
            /// <summary>
            /// 请设置企业用户经办人的手机号。经办人账号标识，手机号或邮箱（指定orgName时，该参数为必传项）
            /// </summary>
            [JsonProperty("psnAccount")]
            public string PsnAccount { get; set; }

            /// <summary>
            /// 经办人账号ID（指定orgId时，该参数为必传项）
            /// </summary>
            [JsonProperty("psnId")]
            public string PsnId { get; set; }
        }

        public class SignFlowInitiator
        {

            [JsonProperty("orgInitiator")]
            public OrgInitiator OrgInitiator { get; set; }
        }

        /// <summary>
        /// 机构签署方信息
        /// 当签署主体为企业/机构用户时请传此对象，orgName与orgId二选一传值即可
        ///    当选择静默签署，autoSign参数为true自动落章时，orgSignerInfo可以不传，后台会默认取appId所属主体企业
        ///
        /// 平台方企业orgId获取方式：https://qianxiaoxia.yuque.com/cloud-delivery/knowledge/ov3elu?singleDoc# 《平台方企业orgId获取方式》
        /// </summary>
        public class OrgSignerInfo
        {
            /// <summary>
            /// 机构账号ID (沙箱和正式版是不一样的)
            /// 平台方企业orgId获取方式：https://qianxiaoxia.yuque.com/cloud-delivery/knowledge/ov3elu?singleDoc# 《平台方企业orgId获取方式》
            /// </summary>
            [JsonProperty("orgId")]
            public string OrgId { get; set; }

            /// <summary>
            /// 请设置企业用户的企业名称
            /// </summary>
            [JsonProperty("orgName")]
            public string OrgName { get; set; }

            [JsonProperty("transactorInfo")]
            public TransactorInfo TransactorInfo { get; set; }
        }

        public class PsnSignerInfo
        {
            /// <summary>
            /// 个人账号标识（手机号或邮箱）用于登录e签宝官网的凭证
            /// </summary>
            [JsonProperty("psnAccount")]
            public string PsnAccount { get; set; }

            /// <summary>
            /// 个人账号ID
            /// </summary>
            [JsonProperty("psnId")]
            public string PsnId { get; set; }
        }

        public class SignConfig
        {

            [JsonProperty("availableSignClientTypes")]
            public string AvailableSignClientTypes { get; set; }

            [JsonProperty("forcedReadingTime")]
            public string ForcedReadingTime { get; set; }

            [JsonProperty("showBatchDropSealButton")]
            public bool ShowBatchDropSealButton { get; set; }

            /// <summary>
            /// 设置签署方的签署顺序
            /// </summary>
            [JsonProperty("signOrder")]
            public int SignOrder { get; set; }
        }

        public class SignFieldPosition
        {
            /// <summary>
            /// 签章区所在页码，补充说明：
            ///（1）当signFieldStyle为1即单页签章时，只能传单个页码
            ///（2）当signFieldStyle为2即骑缝签章时，且acrossPageMode为AssignedPages即指定页码范围时，连续页码可使用'-'指定页码范围，多个页码范围用逗号分隔，例如：1-3,6-10
            /// </summary>
            [JsonProperty("positionPage")]
            public string PositionPage { get; set; }

            [JsonProperty("positionX")]
            public double? PositionX { get; set; }

            [JsonProperty("positionY")]
            public double? PositionY { get; set; }
        }

        /// <summary>
        /// 签章区配置项（指定signFieldType为 0 - 签章区时，该参数为必传项）
        /// </summary>
        public class NormalSignFieldConfig
        {
            /// <summary>
            /// 是否后台自动落章，默认值 false
            ///true - 后台自动落章（无感知），false - 签署页手动签章
            ///    补充说明：
            ///当签署方为个人时，不支持自动签章。
            ///当签署方为机构（且非应用Id所属企业），静默签署自动落章需先经过印章授权，点击查看印章授权规则。
            ///当签署方为应用Id所属主体企业自身静默签署时，支持后台自动落章。
            /// 
            /// 当 autoSign 设置为：true（后台自动签署），e签宝后台会自动获取当前appid所属公司的信息、印章，所以可以不传入签署方信息；平台属于机构类型，所以 signerType 设置为：1 （机构）；签署顺序 signOrder 设置为：1（顺序值小的数字先签署）。
            /// </summary>
            [JsonProperty("autoSign")]
            public bool AutoSign { get; set; }

       
            /// <summary>
            /// 指定印章ID https://open.esign.cn/doc/opendoc/seal3/vk863c
            /// </summary>
            [JsonProperty("assignedSealId")]
            public string AssignedSealId { get; set; }

            /// <summary>
            /// 是否自由签章，默认值 false
            ///true - 是，false - 否
            ///    补充说明：
            ///自由签章 指不限制印章、签署位置、签章样式（单页、骑缝）、和签章个数。
            ///自由签章模式下，无需传normalSignFieldConfig对象下的其他参数。
            /// </summary>
            [JsonProperty("freeMode")]
            public bool FreeMode { get; set; }

            [JsonProperty("movableSignField")]
            public bool MovableSignField { get; set; }

            [JsonProperty("psnSealStyles")]
            public string PsnSealStyles { get; set; }

            [JsonProperty("signFieldPosition")]
            public SignFieldPosition SignFieldPosition { get; set; }

            [JsonProperty("signFieldSize")]
            public int SignFieldSize { get; set; }
            /// <summary>
            /// 签章区样式 1 - 单页签章，2 - 骑缝签章
            /// </summary>
            [JsonProperty("signFieldStyle")]
            public int SignFieldStyle { get; set; }
        }

        /// <summary>
        /// 签署日期配置项
        /// </summary>
        public class SignDateConfig
        {
            /// <summary>
            /// 是否显示签署日期，默认值 0
            ///0 - 不显示，1 - 固定位置显示，2 - 不固定位置
            ///【注】传1时，可以设置签署日期位置的X、Y坐标（如不传入位置，日期默认显示在签署区下方）；
            ///传2时，由用户在签署页面中选择是否开启显示签署日期（默认不开启），开启后日期位置可在页面移动调整。
            /// </summary>
            [JsonProperty("showSignDate")]
            public int ShowSignDate { get; set; }

            /// <summary>
            /// 日期字体大小，默认值 12px
            /// </summary>
            [JsonProperty("fontSize")]
            public int? FontSize { get; set; }

            /// <summary>
            /// 日期格式
            ///yyyy年MM月dd日（默认值）
            ///yyyy-MM-dd
            ///    yyyy/MM/dd
            ///    yyyy-MM-dd HH:mm:ss
            /// </summary>
            [JsonProperty("dateFormat")]
            public string DateFormat { get; set; }

            /// <summary>
            /// 签署日期所在位置X坐标，当showSignDate为 1- 固定位置显示时生效。
            /// </summary>
            [JsonProperty("signDatePositionX")]
            public double? SignDatePositionX { get; set; }

            /// <summary>
            /// 签署日期所在位置Y坐标，当showSignDate为 1- 固定位置显示时生效。
            /// </summary>
            [JsonProperty("signDatePositionY")]
            public double? SignDatePositionY { get; set; }
        }

        /// <summary>
        /// 签署区信息（设置签署方 盖章/签名/文字输入的区域）
        ///【注】单个签署方若对应多个签署区，可传多个数组
        ///（整个流程中，签署区不能超过300个）
        /// </summary>
        public class SignField
        {
            /// <summary>
            /// 开发者自定义业务编号
            /// </summary>
            [JsonProperty("customBizNum")]
            public string CustomBizNum { get; set; }

            /// <summary>
            /// 签署区所在待签署文件ID
            ///【注】这里的fileId需先添加在docs数组中，否则会报错“参数错误: 文件id不在签署流程中”。
            /// </summary>
            [JsonProperty("fileId")]
            public string FileId { get; set; }

            /// <summary>
            /// 签署区类型，默认值为 0。
            ///0 - 签章区（用于加盖印章或签名），1 - 备注区（用于添加备注文字信息）
            /// </summary>
            [JsonProperty("signFieldType")]
            public double SignFieldType { get; set; }

            /// <summary>
            /// 签章区配置项（指定signFieldType为 0 - 签章区时，该参数为必传项）
            /// </summary>
            [JsonProperty("normalSignFieldConfig")]
            public NormalSignFieldConfig NormalSignFieldConfig { get; set; }
            /// <summary>
            /// 签章区配置项（指定signFieldType为 0 - 签章区时，该参数为必传项）
            /// </summary>
            [JsonProperty("signDateConfig")]
            public SignDateConfig SignDateConfig { get; set; }

        }

        public class Signer
        {
            [JsonProperty("orgSignerInfo")]
            public OrgSignerInfo OrgSignerInfo { get; set; }

            /// <summary>
            /// 个人签署方信息
            /// 【注】当签署主体为个人时请传此对象，psnAccount与psnId二选一传值即可
            /// </summary>
            [JsonProperty("psnSignerInfo")]
            public PsnSignerInfo PsnSignerInfo { get; set; }

            [JsonProperty("signConfig")]
            public SignConfig SignConfig { get; set; }

            /// <summary>
            /// 签署方类型，0 - 个人，1 - 机构，2 - 法定代表人
            /// 若指定签署方为个人，则psnSignerInfo为必传项；
            /// 若指定签署方为机构或法定代表人，则orgSignerInfo为必传项；
            /// </summary>
            [JsonProperty("signerType")]
            public int SignerType { get; set; }

            /// <summary>
            /// 签署区信息（设置签署方 盖章/签名/文字输入的区域）
            ///【注】单个签署方若对应多个签署区，可传多个数组
            ///（整个流程中，签署区不能超过300个）
            /// </summary>
            [JsonProperty("signFields")]
            public IList<SignField> SignFields { get; set; }
        }

        public class ChargeConfig
        {

            [JsonProperty("chargeMode")]
            public int ChargeMode { get; set; }
        }



        public class AuthConfig
        {

            [JsonProperty("orgAvailableAuthModes")]
            public IList<string> OrgAvailableAuthModes { get; set; }

            [JsonProperty("psnAvailableAuthModes")]
            public IList<string> PsnAvailableAuthModes { get; set; }

            [JsonProperty("willingnessAuthModes")]
            public IList<string> WillingnessAuthModes { get; set; }
        }

        public class InitiatePageConfig
        {

            [JsonProperty("customBizNum")]
            public string CustomBizNum { get; set; }

            [JsonProperty("redirectUrl")]
            public string RedirectUrl { get; set; }

            [JsonProperty("uneditableFields")]
            public IList<string> UneditableFields { get; set; }
        }

        /// <summary>
        /// 流程整体通知配置项
        /// </summary>
        public class NoticeConfig
        {
            /// <summary>
            /// 通知类型，允许多种通知方式，请使用英文逗号分隔
            ///传空 - 不通知（默认值）
            ///1 - 短信通知
            ///2 - 邮件通知
            ///    通知发起方、签署方、抄送方，默认值为""空字符串
            ///【注】个人账号中需要绑定短信/邮件才有对应的通知方式。
            /// </summary>
            [JsonProperty("noticeTypes")]
            public string NoticeTypes { get; set; }
        }

        /// <summary>
        /// 指定签署操作人
        /// 当获取签署链接场景，需传入当前流程流转到的签署操作人信息。（如不传该参数，后台默认自动带入appId对应主体信息）
        /// psnAccount与psnId二选一传入（必须与发起签署时的账号保持一致）
        /// </summary>
        public class Operator
        {
            /// <summary>
            /// 签署操作人账号标识（手机号/邮箱号）
            /// </summary>
            [JsonProperty("psnAccount")]
            public string PsnAccount { get; set; }
            /// <summary>
            /// 签署操作人账号ID（个人账号ID）
            /// </summary>
            // [JsonProperty("psnId")]
            // public string psnId { get; set; }
        }

        /// <summary>
        /// 重定向配置项
        /// </summary>
        public class RedirectConfig
        {
            /// <summary>
            /// 签署完成后跳转页面（需符合 https /http 协议地址）
            /// </summary>
            [JsonProperty("redirectUrl")]
            public string RedirectUrl { get; set; }

            /// <summary>
            /// 操作完成重定向跳转延迟时间，单位秒（可选值0、3，默认值为 3）
            ///传0时，签署完成直接跳转重定向地址；
            ///传3时，展示签署完成结果页，倒计时3秒后，自动跳转重定向地址。
            ///【注】当redirectUrl不传的情况下，该字段无需传入，签署完成不跳转
            /// </summary>
            [JsonProperty("redirectDelayTime")]
            public int RedirectDelayTime { get; set; }
        }

        public class SignFlowConfig
        {
            /// <summary>
            /// 自动开启签署流程，默认值 true
            /// 自动开启（发起签署流程，将直接进入“签署中”状态）
            /// false - 非自动开启（发起“草稿”状态的签署流程，需调用【开启签署流程】接口后流程进入“签署中”状态）
            ///【注】自动开启的流程不允许再追加待签署文件，点击这里了解更多流程状态说明。
            /// </summary>
            [JsonProperty("autoStart")]
            public bool AutoStart { get; set; } = true;

            /// <summary>
            /// 所有签署方签署完成后流程自动完结，默认值 false
            /// true - 自动完结
            /// false - 非自动完结，需调用【完结签署流程】接口完结
            /// 【注】设置了自动完结的流程中不允许再追加签署区、抄送方，需了解更多流程状态说明。https://open.esign.cn/doc/opendoc/pdf-sign3/gsy6xe
            /// </summary>
            [JsonProperty("autoFinish")]
            public bool AutoFinish { get; set; } = false;

            [JsonProperty("noticeConfig")]
            public NoticeConfig NoticeConfig { get; set; }

            /// <summary>
            /// 接收相关回调通知的Web地址 POST接收 参考 https://open.esign.cn/doc/opendoc/notify3/sblzg8
            /// </summary>
            [JsonProperty("notifyUrl")]
            public string NotifyUrl { get; set; }

            [JsonProperty("redirectConfig")]
            public RedirectConfig RedirectConfig { get; set; }

            [JsonProperty("signFlowTitle")]
            public string SignFlowTitle { get; set; }

            /// <summary>
            /// 签署截止时间， unix时间戳（毫秒）格式，
            ///【注】默认在签署流程创建后的90天时截止。签署中如需延期请调用【延期签署截止时间】接口。https://open.esign.cn/doc/opendoc/pdf-sign3/idv0fv
            /// </summary>
            [JsonProperty("signFlowExpireTime")]
            public long SignFlowExpireTime { get; set; }
        }

    }
}
